/*
 * ColorHSV.h
 *
 *  Created on: Dec 27, 2009
 *      Author: vuk
 */

#ifndef COLORHSV_H_
#define COLORHSV_H_

#include <opencv/cv.h>
#include <opencv/highgui.h>
#include <iostream>

using namespace std;

class ColorHSV
{

protected:
	uchar h, s, v;

public:

//	ColorHSV()
//	{
//		h=0;
//		s=0;
//		v=0;
//	}

	ColorHSV(const int H=0, const int S=255, const int V=255)
	{
		h=(uchar)H;
		s=(uchar)S;
		v=(uchar)V;
	}

	ColorHSV(const uchar H, const uchar S, const uchar V)
	{
		h=H;
		s=S;
		v=V;
	}

	void set(const uchar H, const uchar S, const uchar V)
	{
		h=H;
		s=S;
		v=V;
	}

	void set(const int H=0, const int S=0, const int V=0)
	{
		h=(uchar)H;
		s=(uchar)S;
		v=(uchar)V;
	}

	uchar H() const	{ return h; }
	uchar S() const	{ return s; }
	uchar V() const	{ return v; }

	void setH(const uchar c)	{ h=c; }
	void setS(const uchar c)	{ s=c; }
	void setV(const uchar c)	{ v=c; }

	void addH(const uchar n)		{ (h+n<=180)?   h+=n : h=(h+n)-181 ;}
	void addS(const uchar n)		{ s+=n;	}
	void addV(const uchar n)		{ v+=n;	}

	void subH(const uchar n)		{ (h-n>=0)?    h-=n : h=(h-n)+181 ;}
	void subS(const uchar n)		{ s-=n; }
	void subV(const uchar n)		{ v-=n; }


	ColorHSV& operator=(const ColorHSV &c)
	{
		if(&c!=this)
		{
			this->h=c.h;
			this->s=c.s;
			this->v=c.v;
		}
		return *this;
	}

	bool operator>(const ColorHSV &c) const { return (h>c.h && s>c.s && v>c.v);}
	bool operator<(const ColorHSV &c) const { return (h<c.h && s<c.s && v<c.v);}
	bool operator<=(const ColorHSV &c) const { return (h<=c.h && s<=c.s && v<=c.v);}
	bool operator>=(const ColorHSV &c) const { return (h>=c.h && s>=c.s && v>=c.v);}
	bool operator==(const ColorHSV &c) const { return (h==c.h && s==c.s && v==c.v);}
	bool operator!=(const ColorHSV &c) const { return (h!=c.h && s!=c.s && v!=c.v);}

	bool horeH(const ColorHSV &c) const { return h>=c.h; } //koristi se kao vece  jednako ali, samo proverava H
	bool loreH(const ColorHSV &c) const { return h<=c.h; } //koristi se kao manje jednako, ali samo proverava H

	bool horeSV(const ColorHSV &c) const { return s>=c.s && v>=c.v; } //koristi se kao vece  jednako, ali samo proverava S i V
	bool loreSV(const ColorHSV &c) const { return s<=c.s && v<=c.v; } //koristi se kao manje jednako, ali samo proverava S i V

	bool horeH(const int x) const { return h>=x; } //koristi se kao vece  jednako ali, samo proverava H
	bool loreH(const int x) const { return h<=x; } //koristi se kao manje jednako, ali samo proverava H



	//proverava u kom je odnosu zadati pokazivac koji pokazuje na hsv iz nekog frejma OPASNO!!! Ali efikasno

	bool operator>(const uchar *c) const { return (h>c[0] && s>c[1] && v>c[2]);}
	bool operator<(const uchar *c) const { return (h<c[0] && s<c[1] && v<c[2]);}
	bool operator<=(const uchar *c) const { return (h<=c[0] && s<=c[1] && v<=c[2]);}
	bool operator>=(const uchar *c) const { return (h>=c[0] && s>=c[1] && v>=c[2]);}
	bool operator==(const uchar *c) const { return (h==c[0] && s==c[1] && v==c[2]);}
	bool operator!=(const uchar *c) const { return (h!=c[0] && s!=c[1] && v!=c[2]);}

	bool horeH(const uchar *c) const { return h>=c[0]; } //koristi se kao vece  jednako ali, samo proverava H
	bool loreH(const uchar *c) const { return h<=c[0]; } //koristi se kao manje jednako, ali samo proverava H

	bool horeSV(const uchar *c) const { return s>=c[1] && v>=c[2]; } //koristi se kao vece  jednako, ali samo proverava S i V
	bool loreSV(const uchar *c) const { return s<=c[1] && v<=c[2]; } //koristi se kao manje jednako, ali samo proverava S i V



	friend ostream &operator<<(ostream &out, const ColorHSV& c)
	{
		return out<<(int)c.h<<" "<<(int)c.s<<" "<<(int)c.v<<endl;
	}

};
#endif /* COLORHSV_H_ */
